#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h> 
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "info.h"



#define ERR_LOG(msg) do{ \
    printf("%s-%s-%d\n",__FILE__,__func__,__LINE__); \
    perror(msg);  \
    exit(1); \
}while(0)

#define N 128
char buf[N];

//客户端初始化
void client_init(const char *arg1, const char *arg2, INFO_MSG *msg);

//客户端获取数据
void get_data_client(int sockfd);

void do_user(int socketfd, INFO_MSG *msg);
void do_admin(int socketfd, INFO_MSG *msg);

void do_modify_admin(void);
void do_add_admin(void);
void do_delect_admin(void);
void do_history_admin(void);
void do_query_admin(int socketfd, INFO_MSG *msg);


void do_query_user(int socketfd, INFO_MSG *msg);
void do_modify_user(int socketfd, INFO_MSG *msg);
void do_quit_user(int socketfd, INFO_MSG *msg);


int main(int argc, char const *argv[])
{
    if(argc != 3)
    {
        fprintf(stderr,"Usage: %s <ip> <port>\n",argv[0]);
        exit(1);
    }
    //新增
    INFO_MSG msg;
    client_init(argv[1],argv[2], &msg);

    return 0;
}


void client_init(const char *arg1, const char *arg2, INFO_MSG *msg)
{
    int sockfd;
    struct sockaddr_in server_addr;
    int choose;

    if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0) 
    {
        ERR_LOG("socket failed");
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr(arg1);
    server_addr.sin_port = htons(atoi(arg2));
    socklen_t addrlen = sizeof(struct sockaddr_in);

    if(connect(sockfd, (struct sockaddr *)&server_addr, addrlen) < 0)
    {
        ERR_LOG("accept failed");
    }
START:

    puts("****************************************************");
    puts("********1、管理员模式  2、普通用户模式  3、退出********");
    puts("****************************************************");
    printf("请输入你的选择（数字）>> ");
    scanf("%d", &choose);
    
    switch(choose)
    {
    case 1:
        puts("----------------admin login--------------------");
        do_admin(sockfd,msg);
        break;
    case 2:
        puts("----------------user login--------------------");
        do_user(sockfd,msg);
        break;
    case 3:
        //do_quit();
        break;
    default:
        puts("输入错误，请重新输入");
        goto START;
    }
    while(1)
    {
        get_data_client(sockfd);
    }

    return ;
}

void do_admin(int socketfd, INFO_MSG *msg)
{
    int choose;
START:
    puts("********************************************************************************");
    puts("********* 1：查询  2：修改 3：添加用户  4：删除用户  5：查询历史记录  6：退出********");
    puts("********************************************************************************");
    printf("请输入你的选择（数字）>> ");
    scanf("%d", &choose);
    //getchar();
    switch(choose)
    {
    case 1:
        puts("----------------查询--------------------");
        //do_query_admin(sockfd,msg);
        break;
    case 2:
        puts("----------------修改--------------------");
        //do_modify_admin(sockfd,msg);
        break;
    case 3:
        puts("----------------添加用户--------------------");
        //do_add_admin(sockfd,msg);
        break;
    case 4:
        puts("----------------删除用户--------------------");
        //do_delect_admin(sockfd,msg);

        break;
    case 5:
        puts("----------------查询历史记录--------------------");
       // do_history_admin(sockfd,msg);
        break;   
    case 6:
        puts("----------------退出--------------------");
        //do_quit();
        break;   
    default:
        puts("输入错误，请重新输入");
        goto START;
    }
}

void do_query_admin(int socketfd, INFO_MSG *msg)
{
    puts("查询");
    puts("*************************************************************");
    puts("******* 1：按人名查找  	2：查找所有 	3：退出	 *******");
    puts("*************************************************************");
    int choose,i;
    scanf("%d",&choose);
    getchar();
    if(choose == 1){
        printf("请输入您要查询的用户名\n");
        scanf("%s",msg->info.name);
        getchar();
        //发送修改后的结构体
        msg->msgtype = QUERY;
        msg->usertype = 1;
        if(send(socketfd, msg, sizeof(msg), 0) < 0){
            perror("send()");
            exit(1);
        }

        //获取信息
        bzero(&msg,sizeof(msg));
        if(recv(socketfd, msg, sizeof(msg), 0) < 0){
            perror("recv()");
            exit(1);
        }
        //打印信息
        printf("工号	用户类型	 姓名	密码	年龄	电话  地址	职位	入职年月	等级	 工资 \n");
        printf("%d-%d-%s-%s-%d-%s-%s-%s-%s-%d-%f \n",msg->info.no,\
               msg->info.usertype,msg->info.name,msg->info.passwd,\
               msg->info.age, msg->info.phone, msg->info.addr, \
               msg->info.work, msg->info.data,msg->info.level,\
               msg->info.salary);
    }else if(choose == 2){
        //查询所有用户
        printf("工号	用户类型	 姓名	密码	年龄	电话  地址	职位	入职年月	等级	 工资 \n");
        for(i = 0; i < msg->flags; i++){
            printf("%d-%d-%s-%s-%d-%s-%s-%s-%s-%d-%f \n",msg->info.no,\
                   msg->info.usertype,msg->info.name,msg->info.passwd,\
                   msg->info.age, msg->info.phone, msg->info.addr, \
                   msg->info.work, msg->info.data,msg->info.level,\
                   msg->info.salary);

        }
    }else if(choose == 3){
        exit(0);
    }   
    else{
        printf("输入错误\n");
        exit(1);
    }
}

void do_modify_admin(void)
{
    puts("修改");

}

void do_add_admin(void)
{
    puts("添加用户");
}

void do_delect_admin(void)
{
    puts("删除用户");
}

void do_history_admin(void)
{
    puts("查询历史记录");
}

void do_quit(void)
{
    puts("退出");
}

void do_user(int socketfd, INFO_MSG *msg)
{
    int choose;
START:
    puts("*********************************************");
    puts("*********** 1：查询  2：修改 3：退出***********");
    puts("**********************************************");
    printf("请输入你的选择（数字）>> ");
    scanf("%d", &choose);
    switch(choose)
    {
    case 1:
        puts("----------------查询--------------------");
        do_query_user(socketfd,msg);
        break;
    case 2:
        puts("----------------修改--------------------");
        do_modify_user(socketfd,msg);
        break;  
    case 3:
        puts("----------------退出--------------------");
        do_quit_user(socketfd,msg);
        break;   
    default:
        puts("输入错误，请重新输入");
        goto START;
    }
}

void do_query_user(int socketfd, INFO_MSG *msg)
{
    //发送封装后的结构体
    //bzero(&msg,sizeof(msg));  段错误
    //msg->info.no = 用户输入的用户名     补充
    //msg->info.name = msg->username;
    msg->msgtype = QUERY;
    msg->usertype = 2;
    if(send(socketfd, msg, sizeof(msg), 0) < 0){
        perror("send()");
        exit(1);
    }
    puts("----------------");
    //获取信息
    if(recv(socketfd, msg, sizeof(msg), 0) < 0){
        perror("recv()");
        exit(1);
    }
    //打印信息
    printf("%d-%d-%s-%s-%d-%s-%s-%s-%s-%d-%f \n",msg->info.no,\
           msg->info.usertype,msg->info.name,msg->info.passwd,\
           msg->info.age, msg->info.phone, msg->info.addr, \
           msg->info.work, msg->info.data,msg->info.level,\
           msg->info.salary);
}

void do_modify_user(int socketfd, INFO_MSG *msg)
{
    puts("普通用户修改");
    puts("请输入您要修改的工号");

    //输入要修改的工号
    int num;
    scanf("%d",&num );
    getchar();
    if(000 < num && num > 9999){
        puts("输入NO错误");
        exit(1);
    }
    bzero(&msg,sizeof(msg));
    msg->info.no = num;
    //封装修改的结构体
    msg->msgtype = MODIFY;
    msg->usertype = 2;

    //发送修改后的结构体
    if(send(socketfd,msg,sizeof(msg),0) < 0){
        perror("send()");
        exit(1);
    }
}

void do_quit_user(int socketfd, INFO_MSG *msg)
{
    //发送退出消息给服务器
    msg->msgtype = QUIT;
    msg->usertype = 2;

    //发送修改后的结构体
    if(send(socketfd,msg,sizeof(msg),0) < 0){
        perror("send()");
        exit(1);
    }
    puts("退出成功");
    close(socketfd);
}

void get_data_client(int sockfd)
{
    INFO_MSG info_msg;
    fgets(buf,N,stdin);
    buf[strlen(buf) - 1] = '\0';
    if (send(sockfd,buf,N,0) == -1)
    {
        ERR_LOG("send failed");
    }
    if (strncmp(buf,"quit",4) == 0)
    {
        printf("当前客户端退出连接\n");
        close(sockfd);
        exit(0);
    }
    else
    {
        bzero(buf,N);
        if (recv(sockfd,buf,N,0) == -1)
        {
            ERR_LOG("fail to recv");
        }
        printf("server:%s\n",buf);
    }

    return ;
}






